کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش دستورهای کنترلی و حلقه ها

دوره آموزش برنامه نویسی C#

کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.

دستورهای کنترلی . حلقه ها

اهداف این مبحث

·        آموزش حلقه ی while

·        آموزش حلقه ی do

·        آموزش حلقه ی  for

·        آموزش حلقه ی  foreach

·        یادگیری کامل دستور break

·        آموزش نحوه ی استفاده از دستور continue

حلقه ی while

حلقه ی while ابتدا وضعیت را بررسی می کند، سپس تا زمانی که وضعیت به مقدار صحیح (true) Boolean ارزیابی شود، اجرای بلوکِ کُد را ادامه می دهد. دستور گرامری آن نیز با این شکل می باشد : while () { }. تمام دستورهای معتبر C# در آن کاربرد دارند. ابتدا عبارت Boolean ارزیابی می شود، سپس کدِهای موجود در بلوک بعدی اجرا می شوند. چنانچه عبارت Boolean به true ارزیابی شود، تمام دستورها اجرا می شوند.پس از اینکه اجرای دستورها به پایان رسید، کنترل (control) به منظور بررسی دوباره عبارت Boolean به ابتدای حلقه ی while بازمی گردد.

اما اگر عبارت Boolean به false ارزیابی شود، دستورهای حلقه ی while کاملاً نادیده گرفته می شوند و فرآیند اجرا پس از بسته شدن علامت } این بلوک کد آغاز می گردد. پیش از وارد کردن حلقه، مطمئن شوید که متغیرهای ارزیابی شده در وضعییت حلقه روی حالت یا مقدار اولیه ِشان تنظیم شده اند. هنگام پروسه ی اجرا، سعی کنید متغیرهای عبارت Boolean را پی در پی آپدیت کنید تا هر زمانی که مایل بودید حلقه تمام شود.listing 4-1 نحوه ی پیاده سازی حلقه ی while را نمایش می دهد.

Listing 4-1. حلقه ی while : WhileLoop.cs

using System;
class WhileLoop
{
          
public static void Main()             {                 int myInt = 0;
               
while (myInt < 10)
                {                     Console.Write(
"{0} "‎,
myInt);                     myInt++;                }
                Console.ReadLine();
            }
        }

listing 4-1 حلقه ی while ساده را پیاده می کند. با کلیدواژه ی while آغاز می شود و به دنبال آن عبارت Boolean می آید. تمام دستورهای کنترلی برای ورود / ادامه حلقه از عبارت Boolean به عنوان وضعیت استفاده می کنند. به این معنا که عبارت باید فقط به مقدارهای true یا false ارزیابی شود. در این مثال، متغیر myInt را بررسی می کنیم تا ببینیم از 10 (<) کوچکتر است یا نه. به این خاطر که myInt 0 مقدار دهی شده است، عبارت Boolean اولین بار که ارزیابی می شود true برمی گرداند. زمانی که عبارت Boolean به true ارزیابی می شود، بلوکی که بلافاصله پس از عبارت Boolean آمده، اجرا می شود.

درون بلوک while رقم و فضای خالی برای کنسول پرینت می کنیم. سپس (++) myInt را به عدد صحیح بعدی افزایش می دهیم. پس از اینکه دستورهای بلوک while اجرا شدند، عبارت Boolean دوباره ارزیابی می شود. این ترتیب همین طور ادامه پیدا می کند تا عبارت Boolean به false ارزیابی شود. پس از اینکه عبارت Boolean به false ارزیابی شد، کنترل برنامه به دستور اول پس از بلوک while می پرد. در این مورد، ارقام 0 تا 9 را برای کنسول می نویسیم، از بلوک while خارج می شویم و یک خط جدید برای کنسول پرینت می کنیم.

حلقه ی do

حلقه ی do شبیه حلقه ی while است، با این تفاوت که وضعیت را در پایان حلقه  بررسی می کند. به این معنا که حلقه ی do حداقل یک بار اجرا می شود. در حالی که، حلقه ی while، عبارت Boolean خود را در ابتدا امر بررسی و ارزیابی می کند و احتمال آن هم وجود دارد که هیچ یک از دستورهای درون حلقه اجرا نشوند، مگر اینکه برنامه (code) را طوری تنظیم کنید که دقیقاً این کار را انجام دهد. برای ارائه ی پیغام یا فهرست به کاربر و دریافت ورودی از وی، بهتر است به جای حلقه ی while از حلقه ی do استفاده کنید، همان گونه که در listing 4-2 نمایش داده شده.

Listing 4-2.حلقه ی do : DoLoop.cs

class DoLoop
{
          
public static void Main()             {                 string myChoice;                 do                {
                   
// Print A Menu                      Console.WriteLine("My Address Book\n");                    Console.WriteLine("A - Add New Address");                     Console.WriteLine("D - Delete Address");                     Console.WriteLine("M - Modify Address");                     Console.WriteLine("V - View Addresses");                     Console.WriteLine("Q - Quit\n");                     Console.WriteLine("Choice (A،D،M،V،or Q): ");                     // Retrieve the user's choice                      myChoice = Console.ReadLine();                     // Make a decision based on the user's choice                      switch(myChoice)
                    {                        
case "A":                         case "a":                             Console.WriteLine("You wish to add an address.");                             break;                         case "D":                         case "d":                             Console.WriteLine("You wish to delete an address.");                             break;                        case "M":                         case "m":                             Console.WriteLine("You wish to modify an address.");                             break;                         case "V":                         case "v":                             Console.WriteLine("You wish to view the address list.");                             break;                         case "Q":                         case "q":                             Console.WriteLine("Bye.");                             break;                         default:                             Console.WriteLine("{0} is not a valid choice"‎, myChoice);                             break;                     }                     // Pause to allow the user to see the results                      Console.Write("press Enter key to continue...");                     Console.ReadLine();                     Console.WriteLine();                 } while (myChoice != "Q" && myChoice != "q"); // Keep going until the user wants to quit 
       
   }         }
 

listing 4-2 عملیات حلقه ی do را نشان می دهد. دستور نحوی آن به این صورت است : do } while (); {. می توان از تمام دستورهای برنامه نویسی معتبر C# در آن بهره گرفت. عبارت Boolean آن هم هیچ تفاوتی با عبارت هایی که تا کنون با آن ها برخورد داشتیم ندارد. همان مقدار true یا false را برمی گرداند.

 در عملیات اصلی (Main method)، myChoice را به عنوان نوع string معرفی می کنیم. سپس یک سری دستور برای کنسول پرینت می کنیم. این یک فهرست گزینه برای کاربر خواهد بود. ورودی که باید از کاربر دریافت کنید، در قالب عملیات (method) Console.ReadLine می باشد که مقدار کاربر را به متغیر myChoice بازمی گرداند. ورودی کاربر باید پردازش شود. استفاده از دستور switch کارامدترین شیوه برای انجام این کار است. توجه داشته باشید که برای دستیابی به همان قابلیت، حروف کوچک و بزرگ همخوان در کنار هم قرار داده شده اند. چناچه دستوری بین دو case قرار دهید، دیگر نمی توانید از یک case به case دیگری بروید(fall through در case داشته باشید).

 

حلقه ی  for

حلقه ی  for مانند حلقه ی while کار می کند، با این تفاوت که دستور نحوی حلقه ی for  شامل مقداردهی اولیه و اصلاح وضعیت نیز می شود. حلقه های for  برای زمانی مناسب است که شما بدانید دقیقاً چند بار می خواهید دستورهای داخل حلقه را اجرا کنید. محتویات داخل پرانتزهای حلقه ی for  سه بخش دارد که هریک توسط نقطه ویرگول (;) از هم جدا می شوند.

(; ; ) { }

فهرست مقداردهنده ی اولیه، لیستی است متشکل از عبارت های جدا شده توسط ویرگول. این عبارات تنها یک بار طی حیات حلقه for ارزیابی می شوند. عملیاتی است که تنها یک بار پیش از اجرای حلقه انجام می شود. از این بخش برای مقداردهی و تبدیل یک عدد صحیح به شمارنده استفاده می شود.

پس از این که فهرست مقداردهی (intializer list) ارزیابی شد، حلقه  for  کنترل را به بخش دوم، عبارت Boolean انتقال می دهد. با اینکه تنها یک عبارت Boolean بیشتر وجود ندارد، شما می توانید هر چقدر که مایلید آن را پیچیده کنید البته تا زمانی که نتیجه به true یا false ارزیابی شود. ازعبارت Boolean معمولاً برای بررسی وضعیت متغیر شمارنده استفاده می شود.

دستورهای درون علامت {} حلقه ی for زمانی اجرا می شوند که عبارت Boolean به true ارزیابی شود. پس از اجرای دستورهای حلقه، کنترل به بالای حلقه رفته و فهرست تکرارکننده (iterator) را اجرا می کند که معمولاً وظیفه ی آن کاهش یا افزایش شمارنده است. لیست تکرار کننده (iterator list) می تواند فهرستی از دستورهای جدا شده توسط ویرگول را دربرگیرد ولی معمولاً تنها یک دستور دارد. listing 4-3 نحوه ی پیاده سازی حلقه ی for را نشان می دهد. هدف برنامه هم فقط پرینت اعداد فرد کوچکتر از 10 است.

Listing 4-3. حلقه ی for : ForLoop.cs

using System;        
class
ForLoop
{
          
public static void
Main()
            {
               
for (int i=0; i < 20
; i++)
                {
                   
if (i == 10
)
                       
break
;        
                   
if (i % 2 == 0
)
                       
continue
;       
                    Console.Write(
"{0} ",
i);
                }
               Console.ReadLine();
            }
        }

معمولاً حلقه ی for  دستورات را از علامت "{" تا پایان علامت "}" بدون وقفه اجرا می کند. با این وجود، همان طور که در listing 4-3 مشاهده می کنید، چند استثنا رخ داده است. به دلیل وجود چند دستور، جریان کنترل در بلوک for قطع شده است.

دستور اول برابری i با 0 را بررسی می کند. اکنون کاربرد دیگری از دستور break را مشاهده کردید.رفتار این دستور شبیه به رفتار دستور گزینش (selection) می باشد. دقیقاً در همان لحظه از حلقه خارج گشته و کنترل را به دستور اول پس از پایان بلوک for انتقال می دهد.

دستور دوم برای بررسی اینکه آیا i مضرب 2 هست یا نه از عملگر باقی مانده کمک می گیرد. هنگامی که i تقسیم بر 2 شود و باقی مانده ی آن برابر 0 باشد، به true ارزیابی می شود. پس از این که به true ارزیابی شد، دستور continue اجرا شده و این باعث می شود که کنترل، دستورهای باقی مانده در حلقه را نادیده بگیرد و به فهرست تکرارگر (iterator) برگردد. چناچه دستورهای داخل بلوک را به طور صحیح مرتب کنید، می توانید آن ها را به طور مشروط و بر اساس هر وضعیتی که مایلید اجرا کنید.

پس از اینکه کنترل برنامه به دستور continue یا پایان یک بلوک رسید، این کنترل به بخش سوم که داخل پرانتز حلقه ی for  واقع در لیست تکرارگر است انتقال می یابد. این فهرستی از عملیات جدا شده توسط ویرگول است که پس از پایان اجرای دستورهای (درون) بلوک for اجرا می شود.listing 4-3  یک عمل (action) نوعی است که شمارنده (counter) را افزایش می دهد. پس از اتمام این عملیات، کنترل به منظور ارزیابی به عبارت Boolean انتقال می یابد.

همانند حلقه ی while، حلقه ی for تا زمانی که عبارت Boolean، true است، فعالیت خود را بدون وقفه ادامه می دهد. در صورتی که عبارت Boolean، false بود، کنترل به دستور اول که پس از بلوک  for قرار دارد انتقال می یابد.

حلقه ی foreach

حلقه ی foreach به منظور مرور (تکرار) کلیه ی آیتم های یک فهرست به کار می رود. با آرایه ها یا مجموعه هایی (collection) از جمله ArrayList که در سیستم یافت می شود کار می کند. دستور نحوی آن نیز به این صورت می باشد : ( in ) { }. Type همان نوعی (type) است که در لیست یافت می شود. برای مثال، اگر نوع (type) لیست int[] باشد، Type(the) int، خواهد بود.

متغیر تکرار (iteration variable) شناسه ای است که انتخاب می کنید. این شناسه می تواند هر چیز معنی داری باشد. برای مثال، اگر فهرست مورد نظر شامل آرایه ای از سن مردم بود، اسم معنادار و مناسب برای نام آیتم سن می بود.

کلیدواژه ی in الزامی می باشد. همان گونه که قبل نیز اشاره شد، فهرست می تواند یک آرایه و یا یک مجموعه (collection) باشد.

هنگام مرور (iteration یا تکرار) آیتم های لیست به کمک حلقه ی foreach، فهرست در حالت read-only قرار دارد. به این معنا که فقط می توانید آن را بخوانید و حق دست بردن یا تغییر دادن متغیر تکرار در حلقه ی foreach را ندارید. اینجا به نکته ی ظریفی برمی خوریم، بعد ها شما با نحوه ی ساختن نوع های سفارشی، که کلاس و ساختار خوانده می شود آشنا می شوید. این ها می توانند چند فیلد را همزمان دربرداشته باشند. می توان فیلدهای کلاس و ساختار را تغییر داد، اما نمی توان متغیرهای تکرار هر کلاس یا ساختار را در حلقه ی foreach اصلاح کرد. طی هر مرحله ی تکرارِ حلقه ی foreach، فهرست برای مقدار جدید جستجو می شود. مادام اینکه فهرست مقداری برگرداند، این مقدار بازگردانده شده داخل متغیر تکرار read-only گنجانده می شود که به دنبال آن دستورهای (درون) بلوک foreach اجرا می شوند. پس از اتمام پیمایش مجموعه، کنترل به اولین دستور اجرا شدنی (executable) پس از پایان بلوک foreach انتقال می یابد.

Listing 4-4 شیوه ی استفاده از حلقه ی foreach را به نمایش می گذارد.

using System;
class ForEachLoop
{
          
public static void Main()             {                 string[] names = {"Cheryl"‎,‎ "Joe"‎, "Matt","Robert"};                   foreach (string person in names)                 {                     Console.WriteLine("{0} "‎,
person);                 }             }         }

در این مثال اولین کاری که در main method انجام دادیم، معرفی  و مقداردهی (اولیه) آرایه ی names با چهار strings است. فهرستی است که در حلقه ی foreach به کار رفته.

در حلقه ی foreach از متغیر person،  stringبه عنوان اسم آیتم استفمده کردیم تا تک تک عنصرهای آرایه ی names را در برگیرد. مادام اینکه اسم هایی در آرایه وجود دارند که هنوز برگردانده نشده اند، متد Console.WriteLine تمام مقدارهای متغیر person را برای صفحه پرینت می کند.

چکیده

حلقه ها به کاربر اجازه می دهند تا مجموعه ای از دستورها (block of statement) را بارها اجرا کند.C#  دستورهای زیادی در اختیار کاربر قرار می دهد که می توان با آن ها حلقه ساخت، از جمله  while، do، for و حلقه ی foreach. حلقه های while بلوک دستور را تا زمانی که عبارت درست (true) باشد اجرا می کند، حلقه های do  بوک دستورها را حداقل یک بار اجرا می کند و مادام این که وضعیت صحیح (true) بود به کار خود همچنان ادامه می دهد، حلقه ی for مجموعه دستور را تعداد دفعات مشخصی اجرا می کند و حلقه ی foreach بلوک دستور را به ازای هر آیتم در مجموعه، جداگانه اجرا می کند. به طور معمول اجرای گروه دستور از ابتدا به انتها صورت می گیرد. با این وجود، می توان جریان معمول یک برنامه با دستورهای break و continue تغییر داد.

1394/07/27 3076 1596
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...